package main

import (
	"fmt"
	"math"
	"strings"
)

func main() {
	//常量
	fmt.Println(math.Pi)

	fmt.Println(2e2) //200
	fmt.Println(0.1)
	fmt.Println(0.5)
	fmt.Println(strings.Repeat("*-", 20))
	test()

	z := complex(3.2e2, 13.2)
	fmt.Println(z) //(320+13.2i)
}

/**
计算机通常使用二进制表示浮点数，这意味着有些小数可以精确的表示，但是其他的浮点数只能近似表示。
使用==以及!= 对浮点数进行比较是，要非常小心
*/
func test() {
	x, y := 0.0, 0.0
	for i := 0; i < 10; i++ {
		x += 0.1
		if i%2 == 0 {
			y += 0.2
		} else {
			fmt.Printf("%-5t %-5t %-5t %-5t", x == y, EqualFloat(x, y, -1),
				EqualFloat(x, y, 0.00000000001),
				EqualFloat(x, y, 8))
			fmt.Println(x, y)
		}
	}

}
func EqualFloat(x, y, limit float64) bool {
	if limit <= 0.0 { //设置为负数，表示 将该精度设为机器所能达到的最大精度。
		limit = math.SmallestNonzeroFloat64
	}
	return math.Abs(x-y) <= (limit * math.Min(math.Abs(x), math.Abs(y)))
}

/**
	大多数情况下，如果需要浮点数，float64类型是最好的选择，一个特别的原因是math包中的所有函数都使用float64类型。然而，Go语言也支持
float32类型，这在内存非常宝贵并且无需使用math包，或者愿意处理与float64类型之间进行来回转换的不便时非常有用。
由于Go语言的浮点类型是固定长度的，因此从外部文件或者网络连接中读写时非常安全。
*/
